//第1题*****************************************************************
// const promise = new Promise((resolve, reject) => {
//   console.log(1);
//   resolve('success') //继续执行同步代码，但是promise的状态不再改变了
//   console.log(2);
// });
// promise.then(() => {
//   console.log(3);
// });
// console.log(4);
// 1 2 4 3
//第2题*****************************************************************
// const promise = new Promise((resolve, reject) => {
//   console.log(1);
//   console.log(2);
// });
// promise.then(() => {
//   console.log(3); // promise没有完成，不会走到这
// });
// console.log(4);
// 1 2 4
//第3题*****************************************************************
// const promise1 = new Promise((resolve, reject) => {
//   console.log('promise1')
//   resolve('resolve1')
// })
// const promise2 = promise1.then((res) => {
//   console.log(res)
// })
// console.log('1', promise1);
// console.log('2', promise2);
// promise1 1 Promise{'resolve1'} 2 Promise{<pending>} resolve1
// Promise{<pending>} 因为打印同步代码的时候，then方法还没执行在微任务队列中
//第4题*****************************************************************
// const fn = () => (new Promise((resolve, reject) => {
//   console.log(1);
//   resolve('success')
// }))
// fn().then(res => {
//   console.log(res)
// })
// console.log('start')
// 1 start success
//第5题*****************************************************************
// const fn = () =>
//   new Promise((resolve, reject) => {
//     console.log(1);
//     resolve("success");
//   });
// console.log("start");
// fn().then(res => {
//   console.log(res);
// });
// start 1 success
//第6题*****************************************************************
// console.log('start')
// setTimeout(() => {
//   console.log('time')
// })
// Promise.resolve().then(() => {
//   console.log('resolve')
// })
// console.log('end')
// start end resolve time
//第7题*****************************************************************
// const promise = new Promise((resolve, reject) => {
//   console.log(1);
//   setTimeout(() => {
//     console.log("timerStart");
//     resolve("success");
//     console.log("timerEnd");
//   }, 0);
//   console.log(2);
// });
// promise.then((res) => {
//   console.log(res);
// });
// console.log(4);
// 1 2 4 timerStart timerEnd success
//第8题*****************************************************************
// setTimeout(() => {
//   console.log('timer1');
//   setTimeout(() => {
//     console.log('timer3')
//   }, 0)
// }, 0)
// setTimeout(() => {
//   console.log('timer2')
// }, 0)
// console.log('start')
// 宏任务放入队列依次执行
// start timer1 timer2 timer3
//第9题*****************************************************************
// setTimeout(() => {
//   console.log('timer1');
//   Promise.resolve().then(() => {
//     console.log('promise')
//   })
// }, 0)
// setTimeout(() => {
//   console.log('timer2')
// }, 0)
// console.log('start')
// 宏任务--全部微任务--宏任务
// start timer1 promise timer2
//第10题*****************************************************************
// Promise.resolve().then(() => { ////v1
//   console.log('promise1');
//   const timer2 = setTimeout(() => { //h2
//     console.log('timer2')
//   }, 0)
// });
// const timer1 = setTimeout(() => { ////h1
//   console.log('timer1')
//   Promise.resolve().then(() => { ////v2
//     console.log('promise2')
//   })
// }, 0)
// console.log('start');
// start promise1 timer1 promise2 timer2
//第11题*****************************************************************
// const promise1 = new Promise((resolve, reject) => {
//   setTimeout(() => { ////h1
//     resolve('success')
//   }, 1000)
// })
// const promise2 = promise1.then(() => { ////v1
//   throw new Error('error!!!')
// })
// console.log('promise1', promise1)
// console.log('promise2', promise2)
// setTimeout(() => { //h2
//   console.log('promise1', promise1)
//   console.log('promise2', promise2)
// }, 2000)
// then()返回值不管成功失败还是没有改变，同步打印的都是pending
// promise1 Promise{<pending>} promise2 Promise{<pending>} 微任务报错 promise1{<resolve>:'success'} promise2{<rejected>:Error: error!!!}
//第12题*****************************************************************
// const promise1 = new Promise((resolve, reject) => {
//   setTimeout(() => { ////h1
//     resolve("success");
//     console.log("timer1");
//   }, 1000);
//   console.log("promise1里的内容");
// });
// const promise2 = promise1.then(() => { ////v1
//   throw new Error("error!!!");
// });
// console.log("promise1", promise1);
// console.log("promise2", promise2);
// setTimeout(() => { ////h2
//   console.log("timer2");
//   console.log("promise1", promise1);
//   console.log("promise2", promise2);
// }, 2000);
/**
 * promise1里的内容
 * promise1 Promise{<pending>}
 * promise2 Promise{<pending>}
 * timer1
 * throw new Error("error!!!")
 * timer2
 * promise1 Promise{<resolved>:'success'}
 * promise2 Promise{<rejected>: Error: error!!!}
 */
//第13题*****************************************************************
// const promise = new Promise((resolve, reject) => {
//   resolve("success1");
//   reject("error");
//   resolve("success2");
// });
// promise
// .then(res => {
//     console.log("then: ", res);
//   }).catch(err => {
//     console.log("catch: ", err);
//   })
// then: success1
//第14题*****************************************************************
// const promise = new Promise((resolve, reject) => {
//   reject("error");
//   resolve("success2");
// });
// promise
// .then(res => {
//     console.log("then1: ", res);
//   }).then(res => {
//     console.log("then2: ", res);
//   }).catch(err => {
//     console.log("catch: ", err);
//   }).then(res => {
//     console.log("then3: ", res);
//   })
/**
 * catch: error
 * then3: undefined
 */
//第15题*****************************************************************
// Promise.resolve(1)
//   .then(res => {
//     console.log(res);
//     return 2;
//   })
//   .catch(err => {
//     return 3;
//   })
//   .then(res => {
//     console.log(res);
//   });
/**
 * 1
 * 2
 *  */ 
//第16题*****************************************************************
// Promise.reject(1)
//   .then(res => {
//     console.log(res);
//     return 2;
//   })
//   .catch(err => {
//     console.log(err);
//     return 3
//   })
//   .then(res => {
//     console.log(res);
//   });
/**
 * 1
 * 3
 */
//第17题*****************************************************************
// const promise = new Promise((resolve, reject) => {
//   setTimeout(() => { ////h1
//     console.log('timer')
//     resolve('success') //v1
//   }, 1000)
// })
// const start = Date.now();
// promise.then(res => {
//   console.log(res, Date.now() - start)
// })
// promise.then(res => {
//   console.log(res, Date.now() - start)
// })
/**
 * timer
 * success 1001
 * success 1002
 * then()可以调用多次；足够快两个then的时间可能都是1001
 */
//第18题*****************************************************************
// Promise.resolve().then(() => {
//   return new Error('error!!!')
// }).then(res => {
//   console.log("then: ", res)
// }).catch(err => {
//   console.log("catch: ", err)
// })
// return new Error('error!!!') 等同于return Promise.resolve(new Error('error!!!'))
// 抛出错误的方法：return Promise.reject(new Error('error!!!')); throw new Error('error!!!')
// then: error!!!
//第19题*****************************************************************
// const promise = Promise.resolve().then(() => {
//   return promise;
// })
// promise.catch(console.err)
//.then 或 .catch 返回的值不能是 promise 本身，否则会造成死循环
//第20题*****************************************************************
// Promise.resolve(1)
//   .then(2)
//   .then(Promise.resolve(3))
//   .then(console.log)
// 1
//.then 或者 .catch 的参数期望是函数，传入非函数则会发生值透传
//第21题*****************************************************************
// Promise.reject('err!!!')
//   .then((res) => {
//     console.log('success', res)
//   }, (err) => {
//     console.log('error', err)
//   }).catch(err => {
//     console.log('catch', err)
//   })
//  error err!!!
// 直接then的第二个参数处理
//第22题*****************************************************************
// Promise.resolve()
//   .then(function success (res) {
//     throw new Error('error!!!')
//   }, function fail1 (err) {
//     console.log('fail1', err)
//   }).catch(function fail2 (err) {
//     console.log('fail2', err)
//   })
// fail2：error!!!
//第23题*****************************************************************
// Promise.resolve('1')
//   .then(res => {
//     console.log(res)
//   })
//   .finally(() => {
//     console.log('finally')
//   })
// Promise.resolve('2')
//   .finally(() => {
//     console.log('finally2')
//   	return '我是finally2返回的值'
//   })
//   .then(res => {
//     console.log('finally2后面的then函数', res)
//   })
//finally 即使有return 后面的then接收的结果也是上面成功状态
/**
 * 1
 * finally2
 * finally
 * finally2后面的then函数  2
 */
//第24题*****************************************************************
// Promise.resolve('1')
//   .finally(() => {
//     console.log('finally1')
//     throw new Error('我是finally中抛出的异常')
//   })
//   .then(res => {
//     console.log('finally后面的then函数', res)
//   })
//   .catch(err => {
//     console.log('捕获错误', err)
//   })
/**
 * finally1
 * 捕获错误 Error：我是finally中抛出的异常
 */
//第25题*****************************************************************
// function promise1 () {
//   let p = new Promise((resolve) => {
//     console.log('promise1');
//     resolve('1')
//   })
//   return p;
// }
// function promise2 () {
//   return new Promise((resolve, reject) => {
//     reject('error')
//   })
// }
// promise1()
//   .then(res => console.log(res))
//   .catch(err => console.log(err))
//   .finally(() => console.log('finally1')) //另一个微任务

// promise2()
//   .then(res => console.log(res))
//   .catch(err => console.log(err))
//   .finally(() => console.log('finally2'))
/**
 * promise1
 * 1
 * error
 * finally1
 * finally2
 */
//finally then是两个微任务
//第26题*****************************************************************
// function promise1 () {
//   let p = new Promise((resolve) => {
//     console.log('promise1');
//     resolve('1')
//   })
//   return p;
// }
// function promise2 () {
//   return new Promise((resolve, reject) => {
//     reject('error')
//   })
// }
// promise1()
//   .then(res => console.log(res))
//   .catch(err => console.log(err))
//   .then(() => console.log('finally1'))

// promise2()
//   .then(res => console.log(res))
//   .catch(err => console.log(err))
//   .then(() => console.log('finally2'))
/**
 * promise1
 * 1
 * error
 * finally1
 * finally2
 */
//第27题*****************************************************************
async function async1() {
  console.log("async1 start");
  await async2();
  console.log("async1 end");
}
async function async2() {
  console.log("async2");
}
async1();
console.log('start')
/**
 * async1 start
 * async2
 * start
 * async1 end
 */
// await后面的相当于then()


